/**********************************Copyright (c)**********************************
**                       版权所有 (C), 2015-2020, 涂鸦科技
**
**                             http://www.tuya.com
**
*********************************************************************************/
/**
 * @file    protocol.c
 * @author  涂鸦综合协议开发组
 * @version v1.0.5
 * @date    2021.10.19
 * @brief                
 *                       *******非常重要，一定要看哦！！！********
 *          1. 用户在此文件中实现数据下发/上报功能
 *          2. DP的ID/TYPE及数据处理函数都需要用户按照实际定义实现
 *          3. 当开始某些宏定义后需要用户实现代码的函数内部有#err提示,完成函数后请删除该#err
 */

/****************************** 免责声明 ！！！ *******************************
由于MCU类型和编译环境多种多样，所以此代码仅供参考，用户请自行把控最终代码质量，
涂鸦不对MCU功能结果负责。
******************************************************************************/

/******************************************************************************
                                移植须知:
1:MCU必须在while中直接调用mcu_api.c内的wifi_uart_service()函数
2:程序正常初始化完成后,建议不进行关串口中断,如必须关中断,关中断时间必须短,关中断会引起串口数据包丢失
3:请勿在中断/定时器中断内调用上报函数
******************************************************************************/

#include "wifi.h"
         
/******************************************************************************
                              第一步:初始化
1:在需要使用到wifi相关文件的文件中include "wifi.h"
2:在MCU初始化中调用mcu_api.c文件中的wifi_protocol_init()函数
3:将MCU串口单字节发送函数填入protocol.c文件中uart_transmit_output函数内,并删除#error
4:在MCU串口接收函数中调用mcu_api.c文件内的uart_receive_input函数,并将接收到的字节作为参数传入
5:单片机进入while循环后调用mcu_api.c文件内的wifi_uart_service()函数
******************************************************************************/

/******************************************************************************
                        1:dp数据点序列类型对照表
          **此为自动生成代码,如在开发平台有相关修改请重新下载MCU_SDK**         
******************************************************************************/
const DOWNLOAD_CMD_S download_cmd[] =
{
  {DPID_TDS_IN, DP_TYPE_VALUE},
  {DPID_TEMP_CURRENT, DP_TYPE_VALUE},
  {DPID_BATTERY_STATE, DP_TYPE_ENUM},
  {DPID_BATTERY_PERCENTAGE, DP_TYPE_VALUE},
  {DPID_TAMPER_ALARM, DP_TYPE_BOOL},
  {DPID_SENSOR_PROBE, DP_TYPE_ENUM},
  {DPID_PH, DP_TYPE_VALUE},
  {DPID_CONDUCTIVITY_VALUE, DP_TYPE_VALUE},
  {DPID_ORP_VALUE, DP_TYPE_VALUE},
  {DPID_CL_VALUE, DP_TYPE_VALUE},
  {DPID_UV_VALUE, DP_TYPE_VALUE},
  {DPID_LSI_VALUE, DP_TYPE_VALUE},
  {DPID_CA_VALUE, DP_TYPE_VALUE},
  {DPID_TA_VALUE, DP_TYPE_VALUE},
  {DPID_CALIBRATION, DP_TYPE_BOOL},
  {DPID_CALIBRATION_RESULT, DP_TYPE_ENUM},
  {DPID_CALIBRATION_COMP, DP_TYPE_VALUE},
  {DPID_ALARM_SWITCH, DP_TYPE_BOOL},
  {DPID_UNIT_SWITCH, DP_TYPE_ENUM},
  {DPID_FACTORY_RESET, DP_TYPE_BOOL},
};



/******************************************************************************
                           2:串口单字节发送函数
请将MCU串口发送函数填入该函数内,并将接收到的数据作为参数传入串口发送函数
******************************************************************************/

/**
 * @brief  串口发送数据
 * @param[in] {value} 串口要发送的1字节数据
 * @return Null
 * @note   请在此函数中填写MCU串口发送功能，并将接收到的数据作为参数传递给串口发送函数
 */
void uart_transmit_output(u8 value)
{
    //#error "请将MCU串口发送函数填入该函数,并删除该行"

    // 使用UART4发送数据到涂鸦WiFi模块
    extern void UART4_SendByte(u8 data);
    UART4_SendByte(value);
}

/******************************************************************************
                            1:所有数据上报处理
当前函数处理全部数据上报(包括可下发/可上报和只上报)
  需要用户按照实际情况实现:
  1:需要实现可下发/可上报数据点上报
  2:需要实现只上报数据点上报
此函数为MCU内部必须调用
用户也可调用此函数实现全部数据上报
******************************************************************************/

//自动化生成数据上报函数

/**
 * @brief  系统所有dp点信息上传,实现APP和muc数据同步
 * @param  Null
 * @return Null
 * @note   此函数SDK内部需调用，MCU必须实现该函数内数据上报功能，包括只上报和可上报可下发型数据
 */
void all_data_update(void)
{
    //#error "请在此处理可下发可上报数据及只上报数据示例,处理完成后删除该行"

    mcu_dp_value_update(DPID_TDS_IN, 0);
    mcu_dp_value_update(DPID_TEMP_CURRENT, 0);
    mcu_dp_enum_update(DPID_BATTERY_STATE, 0);
    mcu_dp_value_update(DPID_BATTERY_PERCENTAGE, 0);
    mcu_dp_bool_update(DPID_TAMPER_ALARM, FALSE);
    mcu_dp_enum_update(DPID_SENSOR_PROBE, 0);
    mcu_dp_value_update(DPID_PH, 0);
    mcu_dp_value_update(DPID_CONDUCTIVITY_VALUE, 0);
    mcu_dp_value_update(DPID_ORP_VALUE, 0);
    mcu_dp_value_update(DPID_CL_VALUE, 0);
    mcu_dp_value_update(DPID_UV_VALUE, 0);
    mcu_dp_value_update(DPID_LSI_VALUE, 0);
    mcu_dp_value_update(DPID_CA_VALUE, 220);
    mcu_dp_value_update(DPID_TA_VALUE, 180);
    mcu_dp_bool_update(DPID_CALIBRATION, FALSE);
    mcu_dp_enum_update(DPID_CALIBRATION_RESULT, 1);
    mcu_dp_value_update(DPID_CALIBRATION_COMP, 100);
    mcu_dp_bool_update(DPID_ALARM_SWITCH, TRUE);
    mcu_dp_enum_update(DPID_UNIT_SWITCH, 0);
    mcu_dp_bool_update(DPID_FACTORY_RESET, FALSE);
}

/**
 * @brief  所有DP数据使用0x07(STATE_UPLOAD_CMD)异步上报
 * @param  Null
 * @return Null
 * @note   当WiFi模块发送0x08命令(状态查询)请求时调用此函数
 *         MCU接收到0x08后需要上报所有DP点状态，使用0x07异步上报方式
 */
void all_data_for_wifi_test(void)
{
    u16 length = 0;

    // DP ID: 1 (DPID_TDS_IN) - VALUE类型,值为0
    length = set_wifi_uart_byte(length, DPID_TDS_IN);
    length = set_wifi_uart_byte(length, DP_TYPE_VALUE);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 4);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 0);
    wifi_uart_write_frame(STATE_UPLOAD_CMD, length);  // 0x07 - 异步上报

    // DP ID: 2 (DPID_TEMP_CURRENT) - VALUE类型,值为0
    length = 0;
    length = set_wifi_uart_byte(length, DPID_TEMP_CURRENT);
    length = set_wifi_uart_byte(length, DP_TYPE_VALUE);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 4);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 0);
    wifi_uart_write_frame(STATE_UPLOAD_CMD, length);  // 0x07 - 异步上报

    // DP ID: 6 (DPID_BATTERY_STATE) - ENUM类型,值为0
    length = 0;
    length = set_wifi_uart_byte(length, DPID_BATTERY_STATE);
    length = set_wifi_uart_byte(length, DP_TYPE_ENUM);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 1);
    length = set_wifi_uart_byte(length, 0);
    wifi_uart_write_frame(STATE_UPLOAD_CMD, length);  // 0x07 - 异步上报

    // DP ID: 7 (DPID_BATTERY_PERCENTAGE) - VALUE类型,值为0
    length = 0;
    length = set_wifi_uart_byte(length, DPID_BATTERY_PERCENTAGE);
    length = set_wifi_uart_byte(length, DP_TYPE_VALUE);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 4);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 0);
    wifi_uart_write_frame(STATE_UPLOAD_CMD, length);  // 0x07 - 异步上报

    // DP ID: 8 (DPID_TAMPER_ALARM) - BOOL类型,值为FALSE
    length = 0;
    length = set_wifi_uart_byte(length, DPID_TAMPER_ALARM);
    length = set_wifi_uart_byte(length, DP_TYPE_BOOL);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 1);
    length = set_wifi_uart_byte(length, FALSE);
    wifi_uart_write_frame(STATE_UPLOAD_CMD, length);  // 0x07 - 异步上报

    // DP ID: 9 (DPID_SENSOR_PROBE) - ENUM类型,值为0
    length = 0;
    length = set_wifi_uart_byte(length, DPID_SENSOR_PROBE);
    length = set_wifi_uart_byte(length, DP_TYPE_ENUM);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 1);
    length = set_wifi_uart_byte(length, 0);
    wifi_uart_write_frame(STATE_UPLOAD_CMD, length);  // 0x07 - 异步上报

    // DP ID: 10 (DPID_PH) - VALUE类型,值为0
    length = 0;
    length = set_wifi_uart_byte(length, DPID_PH);
    length = set_wifi_uart_byte(length, DP_TYPE_VALUE);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 4);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 0);
    wifi_uart_write_frame(STATE_UPLOAD_CMD, length);  // 0x07 - 异步上报

    // DP ID: 11 (DPID_CONDUCTIVITY_VALUE) - VALUE类型,值为0
    length = 0;
    length = set_wifi_uart_byte(length, DPID_CONDUCTIVITY_VALUE);
    length = set_wifi_uart_byte(length, DP_TYPE_VALUE);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 4);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 0);
    wifi_uart_write_frame(STATE_UPLOAD_CMD, length);  // 0x07 - 异步上报

    // DP ID: 12 (DPID_ORP_VALUE) - VALUE类型,值为0
    length = 0;
    length = set_wifi_uart_byte(length, DPID_ORP_VALUE);
    length = set_wifi_uart_byte(length, DP_TYPE_VALUE);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 4);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 0);
    wifi_uart_write_frame(STATE_UPLOAD_CMD, length);  // 0x07 - 异步上报

    // DP ID: 13 (DPID_CL_VALUE) - VALUE类型,值为0
    length = 0;
    length = set_wifi_uart_byte(length, DPID_CL_VALUE);
    length = set_wifi_uart_byte(length, DP_TYPE_VALUE);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 4);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 0);
    wifi_uart_write_frame(STATE_UPLOAD_CMD, length);  // 0x07 - 异步上报

    // DP ID: 14 (DPID_UV_VALUE) - VALUE类型,值为0
    length = 0;
    length = set_wifi_uart_byte(length, DPID_UV_VALUE);
    length = set_wifi_uart_byte(length, DP_TYPE_VALUE);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 4);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 0);
    wifi_uart_write_frame(STATE_UPLOAD_CMD, length);  // 0x07 - 异步上报

    // DP ID: 15 (DPID_LSI_VALUE) - VALUE类型,值为0
    length = 0;
    length = set_wifi_uart_byte(length, DPID_LSI_VALUE);
    length = set_wifi_uart_byte(length, DP_TYPE_VALUE);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 4);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 0);
    wifi_uart_write_frame(STATE_UPLOAD_CMD, length);  // 0x07 - 异步上报

    // DP ID: 16 (DPID_CA_VALUE) - VALUE类型,值为220
    length = 0;
    length = set_wifi_uart_byte(length, DPID_CA_VALUE);
    length = set_wifi_uart_byte(length, DP_TYPE_VALUE);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 4);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 220);
    wifi_uart_write_frame(STATE_UPLOAD_CMD, length);  // 0x07 - 异步上报

    // DP ID: 17 (DPID_TA_VALUE) - VALUE类型,值为180
    length = 0;
    length = set_wifi_uart_byte(length, DPID_TA_VALUE);
    length = set_wifi_uart_byte(length, DP_TYPE_VALUE);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 4);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 180);
    wifi_uart_write_frame(STATE_UPLOAD_CMD, length);  // 0x07 - 异步上报

    // DP ID: 18 (DPID_CALIBRATION) - BOOL类型,值为FALSE
    length = 0;
    length = set_wifi_uart_byte(length, DPID_CALIBRATION);
    length = set_wifi_uart_byte(length, DP_TYPE_BOOL);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 1);
    length = set_wifi_uart_byte(length, FALSE);
    wifi_uart_write_frame(STATE_UPLOAD_CMD, length);  // 0x07 - 异步上报

    // DP ID: 19 (DPID_CALIBRATION_RESULT) - ENUM类型,值为1
    length = 0;
    length = set_wifi_uart_byte(length, DPID_CALIBRATION_RESULT);
    length = set_wifi_uart_byte(length, DP_TYPE_ENUM);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 1);
    length = set_wifi_uart_byte(length, 1);
    wifi_uart_write_frame(STATE_UPLOAD_CMD, length);  // 0x07 - 异步上报

    // DP ID: 20 (DPID_CALIBRATION_COMP) - VALUE类型,值为100
    length = 0;
    length = set_wifi_uart_byte(length, DPID_CALIBRATION_COMP);
    length = set_wifi_uart_byte(length, DP_TYPE_VALUE);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 4);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 100);
    wifi_uart_write_frame(STATE_UPLOAD_CMD, length);  // 0x07 - 异步上报

    // DP ID: 21 (DPID_ALARM_SWITCH) - BOOL类型,值为TRUE
    length = 0;
    length = set_wifi_uart_byte(length, DPID_ALARM_SWITCH);
    length = set_wifi_uart_byte(length, DP_TYPE_BOOL);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 1);
    length = set_wifi_uart_byte(length, TRUE);
    wifi_uart_write_frame(STATE_UPLOAD_CMD, length);  // 0x07 - 异步上报

    // DP ID: 23 (DPID_UNIT_SWITCH) - ENUM类型,值为0
    length = 0;
    length = set_wifi_uart_byte(length, DPID_UNIT_SWITCH);
    length = set_wifi_uart_byte(length, DP_TYPE_ENUM);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 1);
    length = set_wifi_uart_byte(length, 0);
    wifi_uart_write_frame(STATE_UPLOAD_CMD, length);  // 0x07 - 异步上报

    // DP ID: 24 (DPID_FACTORY_RESET) - BOOL类型,值为FALSE
    length = 0;
    length = set_wifi_uart_byte(length, DPID_FACTORY_RESET);
    length = set_wifi_uart_byte(length, DP_TYPE_BOOL);
    length = set_wifi_uart_byte(length, 0);
    length = set_wifi_uart_byte(length, 1);
    length = set_wifi_uart_byte(length, FALSE);
    wifi_uart_write_frame(STATE_UPLOAD_CMD, length);  // 0x07 - 异步上报
}

/**
 * @brief  记录型数据组合上报
 * @param[in] {time} 时间数据长度7,首字节表示是否传输标志位，其余依次为年、月、日、时、分、秒
 * @param[in] {dp_bool}   bool型dpid号
 * @param[in] {v_bool}    bool型dp对应值
 * @param[in] {dp_enum}   enum型dpid号
 * @param[in] {v_enum}    enum型dp对应值
 * @param[in] {dp_value}  value型dpid号
 * @param[in] {v_value}   value型dp对应值
 * @param[in] {dp_string} string型dpid号
 * @param[in] {v_string}  string型dp对应值
 * @param[in] {len}       string长度
 * @return SUCCESS(1) or ERROR(0)
 * @note   当需要上报记录数据时调用该函数
 */
u8 dp_record_combine_update(u8 time[],
                                       u8 dp_bool,u8 v_bool,
                                       u8 dp_enum,u8 v_enum,
                                       u8 dp_value,u8 v_value,
                                       u8 dp_string,u8 v_string[],u8 len)
{
    u16 length = 0;

    if(stop_update_flag == ENABLE)
        return SUCCESS;

    //local_time
    length = set_wifi_uart_buffer(length,(u8 *)time,7);

    //bool
    length = set_wifi_uart_byte(length,dp_bool);
    length = set_wifi_uart_byte(length,DP_TYPE_BOOL);
    length = set_wifi_uart_byte(length,0);
    length = set_wifi_uart_byte(length,1);
    if(v_bool == FALSE)
    {
        length = set_wifi_uart_byte(length,FALSE);
    }
    else
    {
        length = set_wifi_uart_byte(length,1);
    }
    //enum
    length = set_wifi_uart_byte(length,dp_enum);
    length = set_wifi_uart_byte(length,DP_TYPE_ENUM);
    length = set_wifi_uart_byte(length,0);
    length = set_wifi_uart_byte(length,1);
    length = set_wifi_uart_byte(length,v_enum);
    //value
    length = set_wifi_uart_byte(length,dp_value);
    length = set_wifi_uart_byte(length,DP_TYPE_VALUE);
    length = set_wifi_uart_byte(length,0);
    length = set_wifi_uart_byte(length,4);
    length = set_wifi_uart_byte(length,v_value >> 24);
    length = set_wifi_uart_byte(length,v_value >> 16);
    length = set_wifi_uart_byte(length,v_value >> 8);
    length = set_wifi_uart_byte(length,v_value & 0xff);
    //string
    length = set_wifi_uart_byte(length,dp_string);
    length = set_wifi_uart_byte(length,DP_TYPE_STRING);
    length = set_wifi_uart_byte(length,len / 0x100);
    length = set_wifi_uart_byte(length,len % 0x100);
    length = set_wifi_uart_buffer(length,(u8 *)v_string,len);

    wifi_uart_write_frame(STATE_RC_UPLOAD_CMD,length);

    return SUCCESS;
}

/******************************************************************************
                                WARNING!!!    
                            2:所有数据下发处理
自动化代码模板函数,具体请用户自行实现数据处理
******************************************************************************/
/*****************************************************************************
函数名称 : dp_download_lsi_value_handle
功能描述 : 针对DPID_LSI_VALUE的处理函数
输入参数 : value:数据源数据
        : length:数据长度
返回参数 : 成功返回:SUCCESS/失败返回:ERROR
使用说明 : 可下发可上报类型,需要在处理完数据后上报处理结果至app
*****************************************************************************/
static unsigned char dp_download_lsi_value_handle(const unsigned char value[], unsigned short length)
{
    //示例:当前DP类型为VALUE
    unsigned char ret;
    unsigned long lsi_value;
    
    lsi_value = mcu_get_dp_download_value(value,length);
    /*
    //VALUE type data processing
    
    */
    
    //There should be a report after processing the DP
    ret = mcu_dp_value_update(DPID_LSI_VALUE,lsi_value);
    if(ret == SUCCESS)
        return SUCCESS;
    else
        return ERROR;
}
/*****************************************************************************
函数名称 : dp_download_ca_value_handle
功能描述 : 针对DPID_CA_VALUE的处理函数
输入参数 : value:数据源数据
        : length:数据长度
返回参数 : 成功返回:SUCCESS/失败返回:ERROR
使用说明 : 可下发可上报类型,需要在处理完数据后上报处理结果至app
*****************************************************************************/
static unsigned char dp_download_ca_value_handle(const unsigned char value[], unsigned short length)
{
    //示例:当前DP类型为VALUE
    unsigned char ret;
    unsigned long ca_value;
    
    ca_value = mcu_get_dp_download_value(value,length);
    /*
    //VALUE type data processing
    
    */
    
    //There should be a report after processing the DP
    ret = mcu_dp_value_update(DPID_CA_VALUE,ca_value);
    if(ret == SUCCESS)
        return SUCCESS;
    else
        return ERROR;
}
/*****************************************************************************
函数名称 : dp_download_ta_value_handle
功能描述 : 针对DPID_TA_VALUE的处理函数
输入参数 : value:数据源数据
        : length:数据长度
返回参数 : 成功返回:SUCCESS/失败返回:ERROR
使用说明 : 可下发可上报类型,需要在处理完数据后上报处理结果至app
*****************************************************************************/
static unsigned char dp_download_ta_value_handle(const unsigned char value[], unsigned short length)
{
    //示例:当前DP类型为VALUE
    unsigned char ret;
    unsigned long ta_value;
    
    ta_value = mcu_get_dp_download_value(value,length);
    /*
    //VALUE type data processing
    
    */
    
    //There should be a report after processing the DP
    ret = mcu_dp_value_update(DPID_TA_VALUE,ta_value);
    if(ret == SUCCESS)
        return SUCCESS;
    else
        return ERROR;
}
/*****************************************************************************
函数名称 : dp_download_calibration_handle
功能描述 : 针对DPID_CALIBRATION的处理函数
输入参数 : value:数据源数据
        : length:数据长度
返回参数 : 成功返回:SUCCESS/失败返回:ERROR
使用说明 : 可下发可上报类型,需要在处理完数据后上报处理结果至app
*****************************************************************************/
static unsigned char dp_download_calibration_handle(const unsigned char value[], unsigned short length)
{
    //示例:当前DP类型为BOOL
    unsigned char ret;
    //0:off/1:on
    unsigned char calibration;
    
    calibration = mcu_get_dp_download_bool(value,length);
    if(calibration == 0) {
        //bool off
    }else {
        //bool on
    }
  
    //There should be a report after processing the DP
    ret = mcu_dp_bool_update(DPID_CALIBRATION,calibration);
    if(ret == SUCCESS)
        return SUCCESS;
    else
        return ERROR;
}
/*****************************************************************************
函数名称 : dp_download_calibration_comp_handle
功能描述 : 针对DPID_CALIBRATION_COMP的处理函数
输入参数 : value:数据源数据
        : length:数据长度
返回参数 : 成功返回:SUCCESS/失败返回:ERROR
使用说明 : 可下发可上报类型,需要在处理完数据后上报处理结果至app
*****************************************************************************/
static unsigned char dp_download_calibration_comp_handle(const unsigned char value[], unsigned short length)
{
    //示例:当前DP类型为VALUE
    unsigned char ret;
    unsigned long calibration_comp;
    
    calibration_comp = mcu_get_dp_download_value(value,length);
    /*
    //VALUE type data processing
    
    */
    
    //There should be a report after processing the DP
    ret = mcu_dp_value_update(DPID_CALIBRATION_COMP,calibration_comp);
    if(ret == SUCCESS)
        return SUCCESS;
    else
        return ERROR;
}
/*****************************************************************************
函数名称 : dp_download_alarm_switch_handle
功能描述 : 针对DPID_ALARM_SWITCH的处理函数
输入参数 : value:数据源数据
        : length:数据长度
返回参数 : 成功返回:SUCCESS/失败返回:ERROR
使用说明 : 可下发可上报类型,需要在处理完数据后上报处理结果至app
*****************************************************************************/
static unsigned char dp_download_alarm_switch_handle(const unsigned char value[], unsigned short length)
{
    //示例:当前DP类型为BOOL
    unsigned char ret;
    //0:off/1:on
    unsigned char alarm_switch;
    
    alarm_switch = mcu_get_dp_download_bool(value,length);
    if(alarm_switch == 0) {
        //bool off
    }else {
        //bool on
    }
  
    //There should be a report after processing the DP
    ret = mcu_dp_bool_update(DPID_ALARM_SWITCH,alarm_switch);
    if(ret == SUCCESS)
        return SUCCESS;
    else
        return ERROR;
}
/*****************************************************************************
函数名称 : dp_download_unit_switch_handle
功能描述 : 针对DPID_UNIT_SWITCH的处理函数
输入参数 : value:数据源数据
        : length:数据长度
返回参数 : 成功返回:SUCCESS/失败返回:ERROR
使用说明 : 可下发可上报类型,需要在处理完数据后上报处理结果至app
*****************************************************************************/
static unsigned char dp_download_unit_switch_handle(const unsigned char value[], unsigned short length)
{
    //示例:当前DP类型为ENUM
    unsigned char ret;
    unsigned char unit_switch;
    
    unit_switch = mcu_get_dp_download_enum(value,length);
    switch(unit_switch) {
        case 0:
        break;
        
        case 1:
        break;
        
        default:
    
        break;
    }
    
    //There should be a report after processing the DP
    ret = mcu_dp_enum_update(DPID_UNIT_SWITCH, unit_switch);
    if(ret == SUCCESS)
        return SUCCESS;
    else
        return ERROR;
}
/*****************************************************************************
函数名称 : dp_download_factory_reset_handle
功能描述 : 针对DPID_FACTORY_RESET的处理函数
输入参数 : value:数据源数据
        : length:数据长度
返回参数 : 成功返回:SUCCESS/失败返回:ERROR
使用说明 : 可下发可上报类型,需要在处理完数据后上报处理结果至app
*****************************************************************************/
static unsigned char dp_download_factory_reset_handle(const unsigned char value[], unsigned short length)
{
    //示例:当前DP类型为BOOL
    unsigned char ret;
    //0:off/1:on
    unsigned char factory_reset;
    
    factory_reset = mcu_get_dp_download_bool(value,length);
    if(factory_reset == 0) {
        //bool off
    }else {
        //bool on
    }
  
    //There should be a report after processing the DP
    ret = mcu_dp_bool_update(DPID_FACTORY_RESET,factory_reset);
    if(ret == SUCCESS)
        return SUCCESS;
    else
        return ERROR;
}



/******************************************************************************
                                WARNING!!!                     
该部分函数用户请勿修改！！
******************************************************************************/

/**
 * @brief  dp下发处理函数
 * @param[in] {dpid} dpid 序号
 * @param[in] {value} dp数据缓冲区地址
 * @param[in] {length} dp数据长度
 * @return dp处理结果
 * -           0(ERROR): 失败
 * -           1(SUCCESS): 成功
 * @note   该函数用户不能修改
 */
u8 dp_download_handle(u8 dpid,const u8 value[], u16 length)
{
    /*********************************
    当前函数处理可下发/可上报数据调用                    
    具体函数内需要实现下发数据处理
    完成用需要将处理结果反馈至APP端,否则APP会认为下发失败
    ***********************************/
    u8 ret;
    switch(dpid)
    {
        case DPID_LSI_VALUE:
            //LSI处理函数
            ret = dp_download_lsi_value_handle(value,length);
        break;
        case DPID_CA_VALUE:
            //CA处理函数
            ret = dp_download_ca_value_handle(value,length);
        break;
        case DPID_TA_VALUE:
            //TA处理函数
            ret = dp_download_ta_value_handle(value,length);
        break;
        case DPID_CALIBRATION:
            //校准处理函数
            ret = dp_download_calibration_handle(value,length);
        break;
        case DPID_CALIBRATION_COMP:
            //校准补偿处理函数
            ret = dp_download_calibration_comp_handle(value,length);
        break;
        case DPID_ALARM_SWITCH:
            //报警开关处理函数
            ret = dp_download_alarm_switch_handle(value,length);
        break;
        case DPID_UNIT_SWITCH:
            //体积单位处理函数
            ret = dp_download_unit_switch_handle(value,length);
        break;
        case DPID_FACTORY_RESET:
            //出厂设置处理函数
            ret = dp_download_factory_reset_handle(value,length);
        break;

        
        default:
        break;
    }
    return ret;
}

/**
 * @brief  获取所有dp命令总和
 * @param[in] Null
 * @return 下发命令总和
 * @note   该函数用户不能修改
 */
u8 get_download_cmd_total(void)
{
    return(sizeof(download_cmd) / sizeof(download_cmd[0]));
}


/******************************************************************************
                                WARNING!!!                     
此代码为SDK内部调用,请按照实际dp数据实现函数内部数据
******************************************************************************/
#ifdef SUPPORT_MCU_RTC_CHECK
/**
 * @brief  MCU校对本地RTC时钟
 * @param[in] {time} 获取的时间数据
 * @return 无
 * @note   MCU需要自行实现该功能
 */
void mcu_write_rtctime(u8 time[])
{
    //#error "请自行完成RTC时钟写入代码,并删除该行"

    if(time[0] == 1)
    {

    }
    else
    {

    }
}
#endif

#ifdef WIFI_TEST_ENABLE
/**
 * @brief  wifi功能测试反馈
 * @param[in] {result} wifi功能测试结果
 * @ref       0: 失败
 * @ref       1: 成功
 * @param[in] {rssi} 测试成功表示wifi信号强度/测试失败表示错误类型
 * @return Null
 * @note   MCU需要自行实现该功能
 */
void wifi_test_result(u8 result,u8 rssi)
{
    //#error "请自行实现wifi功能测试成功/失败代码,完成后请删除该行"

    if(result == 0)
    {

    }
    else
    {

    }
}
#endif

#ifdef WIFI_MODULE_UPDATE
/**
 * @brief  请求 WIFI 模块固件升级结果返回
 * @param[in] {result} 请求 WIFI 模块固件升级结果;
 * @ref    0x00(开始检测固件更新) 不可断电
 * @ref    0x01(已经是最新固件) 断电
 * @ref    0x02(正在更新固件) 不可断电
 * @ref    0x03(固件更新成功) 断电
 * @ref    0x04(固件更新失败) 断电
 * @return 无
 * @note   MCU需要自行实现该功能
 */
void qur_module_ug_result(u8 result)
{
    //#error "请自行实施请求WIFI模块固件升级结果返回码。 请在完成后删除该行"

    switch(result)
    {
        case 0:
        break;
        case 1:
        break;
        case 2:
        break;
        case 3:
        break;
        case 4:
        break;
        default:
        break;
    }
}
#endif

#ifdef WIFI_QUERY_ROUTE_RSSI
/**
 * @brief  查询当前连接路由器信号强度
 * @param[in] {result} wifi功能测试结果;0:失败/1:成功
 * @param[in] {rssi} 测试成功表示wifi信号强度/测试失败表示错误类型
 * @return 无
 * @note   MCU需要自行实现该功能
 */
void router_strenth_result(u8 result,u8 rssi)
{
    //#error "请自行实现查询当前连接路由器信号强度处理代码,完成后请删除该行"

    if(result == 0)
    {
        if(rssi == 0x00)
        {

        }
        else if(rssi == 0x01)
        {

        }
    }
    else
    {

    }
}
#endif

#ifdef SUPPORT_MCU_FIRM_UPDATE
/**
 * @brief  请求 MCU 固件升级结果返回
 * @param[in] {result} 结果返回
 * @return 无
 * @note   MCU需要自行实现该功能
 */
void qur_ug_result(u8 result)
{
    //#error "请自行实现请求 MCU 固件升级结果返回处理代码,完成后请删除该行"

    switch(result)
    {
        case 0:
        break;
        case 1:
        break;
        case 2:
        break;
        case 3:
        break;
        case 4:
        break;
        default:
        break;
    }
}

/**
 * @brief  升级包大小选择
 * @param[in] {package_sz} 升级包大小
 * @ref           0x00: 256byte (默认)
 * @ref           0x01: 512byte
 * @ref           0x02: 1024byte
 * @return 无
 * @note   MCU需要自行实现该功能
 */
void upgrade_package_choose(u8 package_sz)
{
    //#error "请自行实现wifi功能测试成功/失败代码,完成后请删除该行"

    u16 length = 0;
    length = set_wifi_uart_byte(length,package_sz);
    wifi_uart_write_frame(UPDATE_START_CMD,length);
}

/**
 * @brief  MCU固件升级数据处理
 * @param[in] {value} 固件缓冲区
 * @param[in] {position} 当前数据包在于固件位置
 * @param[in] {length} 当前固件包长度(固件包长度为0时,表示固件包发送完成)
 * @return 无
 * @note   MCU需要自行实现该功能
 */
u8 mcu_firm_update_handle(const u8 value[],u32 position,u16 length)
{
    //#error "请自行完成MCU固件升级数据处理代码,完成后请删除该行"

    if(length == 0)
    {

    }
    else
    {

    }

    return SUCCESS;
}
#endif

